<?php
/**
 * 方法汇总
 *url 根入口 get_path_url
 *物理 get_path_root
 * 图片路径 get_image_path
 *检查是否是微信浏览器访问 is_wechat_browser()
*json 接口返回  function return_data($error_code=0,$error_msg='',$data=array())
* 格式化商品价格  price_format($price,$price_format=0, $change_price = true) {}
*判断某个商品是否正在特价促销期bargain_price($price, $start, $end)
*创建像这样的查询: "IN('a','b')";db_create_in
*取汉字的第一个字的首字母 getFirstCharter
*随机数 random()
*写入文件 write_file
*创建目录 mkdirs
*读取目录 read_file
*post模拟浏览url post_data
*分页 get_page_list
*获取商品销量总数 get_goods_count
*获得当前格林威治时间的时间戳 gmtime 本地时间local_date
*处理序列化的支付 unserialize_config
* 计算运费 shipping_fee
*单需要支付的支付费用 vpay_fee
*计算积分的价值 value_of_integral
* 格式化重量 formated_weight
* 数组输出xml  array_toXml
 */

/**
 * 检查是否是微信浏览器访问
 */
function is_wechat_browser()
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    if (strpos($user_agent, 'MicroMessenger') === false) {
        return false;
    } else {
        return true;
    }
}

//json 接口返回
function return_data($error_code=0,$error_msg='',$data=array())
{
  if(!$data)$data=array();

   $ar=array('error_code' =>$error_code,'error_msg'=>$error_msg,'data'=>$data);
   echo (json_encode($ar));
   exit;
}
//url 根入口
function get_path_url() {
    $url="http://".$_SERVER['HTTP_HOST'].__ROOT__.'/';
    $url=str_replace("app_api/","",$url);
    return $url;
}

//手机mobile网站图片路径
function get_image_mobile_path($img)
{
    $url="http://".$_SERVER['HTTP_HOST'].__ROOT__.'/';
    $url=str_replace("app_api/","",$url);
    $url.="mobile/";

    if(!$img)
    {
        $img_url=get_path_url().'data/common/images/no_picture.gif';//没有产品时
    }
    else
    {
        $img_url=$url.$img;
    }
           
   return $img_url;
}

//根目录
function get_path_root() {
    $RATH = dirname(dirname(dirname(dirname(__FILE__))));
    return $RATH;
}
//图片路径
function get_image_path($img,$del=false)
{
    if(!$img)
    {
        $img_url=get_path_url().'data/common/images/no_picture.gif';//没有产品时
    }
    else
    {
        $img_url=get_path_url().$img;
    }
           
   return $img_url;
}

/**
 * 获得当前格林威治时间的时间戳
 *
 * @return  integer
 */
function gmtime() {
    // return time();
     return (time() - date('Z'));
}


/**
 * 输出xml字符
 * @throws WxPayException
**/
function array_toXml($values)
{

    
    if(!is_array($values) 
        || count($values) <= 0)
    {
        // throw new WxPayException("数组数据异常！");
        return false;
    }
    
    $xml = "<xml>";
    foreach ($values as $key=>$val)
    {

        if(empty($val))continue;

        if (is_numeric($val)){
            $xml.="<".$key.">".$val."</".$key.">";
        }else{
            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
    }
    $xml.="</xml>";
    return $xml; 
    }

/**
 * 将GMT时间戳格式化为用户自定义时区日期
 *
 * @param  string       $format
 * @param  integer      $time       该参数必须是一个GMT的时间戳
 *
 * @return  string
 */
function local_date($type=1, $time = NULL) {

    $timezone=M('shop_config')->where("code='timezone'")->getField('value');
    $timezone =$timezone? $timezone :0;

    if(intval($type))
    {
        $type==1?$format= "Y年n月j日":$format= "Y年n月j日H点i分s秒";
    }
    else
    {$format=$type;}

    if ($time === NULL) {
        $time = gmtime();
    } elseif ($time <= 0) {
        return '';
    }

    $time += ($timezone * 3600);

    return date($format, $time);
}
/**
 * 格式化商品价格
 *
 * @access  public
 * @param   float   $price  商品价格
 * @return  string
 */
function price_format($price,$price_format=0, $change_price = true) {

    $currency_format=M('shop_config')->where("code='currency_format'")->getField('value');
    $currency_format=$currency_format?$currency_format:'￥%s';

    
    if ($price === '') {
        $price = 0;
    }
    $price = 0 + $price;//添加这一行，转换成数值
    if ($change_price) {
        switch ($price_format) {
            case 0:
                $price = number_format($price, 2, '.', '');
                break;
            case 1: // 保留不为 0 的尾数
                $price = preg_replace('/(.*)(\\.)([0-9]*?)0+$/', '\1\2\3', number_format($price, 2, '.', ''));

                if (substr($price, -1) == '.') {
                    $price = substr($price, 0, -1);
                }
                break;
            case 2: // 不四舍五入，保留1位
                $price = substr(number_format($price, 2, '.', ''), 0, -1);
              
                break;
            case 3: // 直接取整
                $price = intval($price);
                break;
            case 4: // 四舍五入，保留 1 位
                $price = number_format($price, 1, '.', '');
                break;
            case 5: // 先四舍五入，不保留小数
                $price = round($price);
                break;
        }
    } else {
        $price = number_format($price, 2, '.', '');
    }



    return sprintf($currency_format, $price);
}


/**
 * 判断某个商品是否正在特价促销期
 *
 * @access  public
 * @param   float   $price      促销价格
 * @param   string  $start      促销开始日期
 * @param   string  $end        促销结束日期
 * @return  float   如果还在促销期则返回促销价，否则返回0
 */
function bargain_price($price, $start, $end) {
    if ($price == 0) {
        return 0;
    } else {
        //$time = gmtime()
		$time = time();
        if ($time >= $start && $time <= $end) {
            return $price;
        } else {
            return 0;
        }
    }
}


/**
 * 创建像这样的查询: "IN('a','b')";
 *
 * @access   public
 * @param    mix      $item_list      列表数组或字符串
 * @param    string   $field_name     字段名称
 *
 * @return   void
 */
function db_create_in($item_list, $field_name = '') {
    if (empty($item_list)) {
        return $field_name . " IN ('') ";
    } else {
        if (!is_array($item_list)) {
            $item_list = explode(',', $item_list);
        }
        $item_list = array_unique($item_list);
        $item_list_tmp = '';
        foreach ($item_list AS $item) {
            if ($item !== '') {
                $item_list_tmp .= $item_list_tmp ? ",'$item'" : "'$item'";
            }
        }
        if (empty($item_list_tmp)) {
            return $field_name . " IN ('') ";
        } else {
            return $field_name . ' IN (' . $item_list_tmp . ') ';
        }
    }
}


/** 
    * 取汉字的第一个字的首字母 
    * @param type $str 
    * @return string|null 
    */  
 function getFirstCharter($str){  
        if(empty($str)){return '';}  
        $fchar=ord($str{0});  
        if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});  
        $s1=iconv('UTF-8','gb2312',$str); 
        $s2=iconv('gb2312','UTF-8',$s1);
        $s=$s2==$str?$s1:$str;
        $asc=ord($s{0})*256+ord($s{1})-65536;  
        if($asc>=-20319&&$asc<=-20284) return 'A';
        if($asc>=-20283&&$asc<=-19776) return 'B';  
        if($asc>=-19775&&$asc<=-19219) return 'C';  
        if($asc>=-19218&&$asc<=-18711) return 'D';  
        if($asc>=-18710&&$asc<=-18527) return 'E';  
        if($asc>=-18526&&$asc<=-18240) return 'F';  
        if($asc>=-18239&&$asc<=-17923) return 'G';  
        if($asc>=-17922&&$asc<=-17418) return 'H';  
        if($asc>=-17417&&$asc<=-16475) return 'J';  
        if($asc>=-16474&&$asc<=-16213) return 'K';  
        if($asc>=-16212&&$asc<=-15641) return 'L';  
        if($asc>=-15640&&$asc<=-15166) return 'M';  
        if($asc>=-15165&&$asc<=-14923) return 'N';  
        if($asc>=-14922&&$asc<=-14915) return 'O';  
        if($asc>=-14914&&$asc<=-14631) return 'P';  
        if($asc>=-14630&&$asc<=-14150) return 'Q';  
        if($asc>=-14149&&$asc<=-14091) return 'R';  
        if($asc>=-14090&&$asc<=-13319) return 'S';  
        if($asc>=-13318&&$asc<=-12839) return 'T';  
        if($asc>=-12838&&$asc<=-12557) return 'W';  
        if($asc>=-12556&&$asc<=-11848) return 'X';  
        if($asc>=-11847&&$asc<=-11056) return 'Y';  
        if($asc>=-11055&&$asc<=-10247) return 'Z';  
        return null;  
   }  

//随机数
    function random($length = 6, $numeric = 0) {
        PHP_VERSION < '4.2.0' && mt_srand((double) microtime() * 1000000);
        if ($numeric) {
            $hash = sprintf('%0' . $length . 'd', mt_rand(0, pow(10, $length) - 1));
        } else {
            $hash = '';
            $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
            $max = strlen($chars) - 1;
            for ($i = 0; $i < $length; $i++) {
                $hash .= $chars[mt_rand(0, $max)];
            }
        }
        return $hash;
    }
//写入文件日志
     function write_file($path,$file_name, $content) {
       
        $RATH=dirname(dirname(dirname(dirname(__FILE__))));
        mkdirs($RATH. $path);
        $filename = $RATH. $path . $file_name;
        $Ts = fopen($filename, "a+");
        fputs($Ts, "\r\n" . $content);
        fclose($Ts);
    }
//检测创建目录
    function mkdirs($dir, $mode = 0777) {
        if (is_dir($dir) || @mkdir($dir, $mode))
            return TRUE;
        if (!mkdirs(dirname($dir), $mode))
            return FALSE;
        return @mkdir($dir, $mode);
    }
    //读取目录
     function read_file($path='/Data/smslog/',$file_name) {
        $RATH=dirname(dirname(dirname(dirname(__FILE__))));

        $content = '';
        $filename =$RATH.$path.$file_name;

        if (function_exists('file_get_contents')) {
            @$content = file_get_contents($filename);
        } else {
            if (@$fp = fopen($filename, 'r')) {
                @$content = fread($fp, filesize($filename));
                @fclose($fp);
            }
        }
        $content = explode("\r\n", $content);
        return end($content);
    }
  //POST传递值
    function post_data($curlPost,$url){
          $curl = curl_init();
          curl_setopt($curl, CURLOPT_URL, $url);
          curl_setopt($curl, CURLOPT_HEADER, false);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl, CURLOPT_NOBODY, true);
          curl_setopt($curl, CURLOPT_POST, true);
          curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
          $return_str = curl_exec($curl);
          curl_close($curl);
          return $return_str;
   }

   function upload_image($f_name='',$upload_dir = 'images') {

        add_file_postfix($f_name);

        $upload = new \Think\Upload();// 实例化上传类
        $upload->maxSize   =     3145728 ;// 设置附件上传大小
        $upload->exts      =     array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
        $upload->rootPath  =      './Uploads/'.$upload_dir.'/'; // 设置附件上传根目录
        $upload->savePath  =      ''; // 设置附件上传（子）目录
        $upload->subName  ='';//子目录创建
        // $upload->saveName = time();


        mkdirs($upload->rootPath);
        // 上传文件 
        $info   =   $upload->uploadOne($_FILES[$f_name]);


        if(!$info) {// 上传错误提示错误信息
             return array('error' => 1, 'message' =>$upload->getError());
        }else{// 上传成功 获取上传文件信息

            $str='Uploads/'.$upload_dir.'/'.$info['savepath'].$info['savename'];
            return array('error' => 0, 'message' =>$str);
        }
    }

         //解决app 传送没后缀图片类型的问题 
     function add_file_postfix($name)
     {

       if($name)
       {
            $ftype=$_FILES[$name]['type'];
            $fname=$_FILES[$name]['name'];
            $ar_n=explode('.', $fname);

            if(!$ar_n[1])
            {
                $ar_tp=explode('/', $ftype);
                $_FILES[$name]['name']=$fname.'.'.$ar_tp[1];
                return $_FILES[$name]['name'];
            }
       }

         return false;
        
            
     }
//分页---num--数据数量
     function get_page_list($list=array(),$last=1,$limit=10,$num=0)
     {
        $page['list']=$list?$list:array();
        $page['amount']=$limit;
        $page_num=ceil($num/$limit);
        if(empty($list))
        {
            $page['last']=0;
        }
        else
        {
           if($page_num>$last)
            $page['last']=$last+1;
           else
           $page['last']=0;       
        }
  

       return $page;

     }
/* * ********************************************************
 * 基础函数库
 * ******************************************************** */

/**
 * 截取UTF-8编码下字符串的函数
 *
 * @param   string      $str        被截取的字符串
 * @param   int         $length     截取的长度
 * @param   bool        $append     是否附加省略号
 *
 * @return  string
 */
function sub_str($str, $length = 0, $append = true) {
    $str = trim($str);
    $strlength = strlen($str);

    if ($length == 0 || $length >= $strlength) {
        return $str;
    } elseif ($length < 0) {
        $length = $strlength + $length;
        if ($length < 0) {
            $length = $strlength;
        }
    }

    if (function_exists('mb_substr')) {
        $newstr = mb_substr($str, 0, $length, 'utf8');
    } elseif (function_exists('iconv_substr')) {
        $newstr = iconv_substr($str, 0, $length, 'utf8');
    } else {
        //$newstr = trim_right(substr($str, 0, $length));
        $newstr = substr($str, 0, $length);
    }

    if ($append && $str != $newstr) {
        $newstr .= '...';
    }

    return $newstr;
}

/**
 * 获取商品销量总数
 *
 * @access public
 * @param integer $goods_id
 * @return integer
 */
function get_goods_count($goods_id)
{
    
    
    /* 统计时间段 */
    $period = 1;
    $ext = '';
    if ($period == 1) {// 一年
        $ext = "AND o.add_time >'" . local_strtotime('-1 years') . "'";
    } elseif ($period == 2) {// 半年
        $ext = "AND o.add_time > '" . local_strtotime('-6 months') . "'";
    } elseif ($period == 3) {// 三个月
        $ext = " AND o.add_time > '" . local_strtotime('-3 months') . "'";
    } elseif ($period == 4) {// 一个月
        $ext = " AND o . add_time > '" . local_strtotime(' - 1 months') . "'";
    }
    /* 查询该商品销量 */
    $sql = 'SELECT IFNULL(SUM(g.goods_number), 0) as count ' .
        'FROM '.C('DB_PREFIX') .'order_info AS o, '.C('DB_PREFIX') .'order_goods AS g ' .
        "WHERE o . order_id = g . order_id " .
        " AND o . order_status=5 ".
        " AND o . shipping_status=2 " .
        " AND o . pay_status=2 " .
        " AND g . goods_id = '$goods_id'";
    $list = M()->query($sql);
    $result=$list[0];
    
    $sql="select sales_volume_base from ".C('DB_PREFIX')."goods where   goods_id = '$goods_id'"; 
    $data =M()->query($sql);
    $row=$data[0];
    
    return $row['sales_volume_base']+$result['count'];
}

/* * ********************************************************
 * 购物流程函数库
 * ******************************************************** */

/**
 * 处理序列化的支付、配送的配置参数
 * 返回一个以name为索引的数组
 *
 * @access  public
 * @param   string       $cfg
 * @return  void
 */
function unserialize_config($cfg) {
    if (is_string($cfg) && ($arr = unserialize($cfg)) !== false) {
        $config = array();

        foreach ($arr AS $key => $val) {
            $config[$val['name']] = $val['value'];
        }

        return $config;
    } else {
        return false;
    }
}
/**
 * 计算运费
 * @param   string  $shipping_code      配送方式代码
 * @param   mix     $shipping_config    配送方式配置信息
 * @param   float   $goods_weight       商品重量
 * @param   float   $goods_amount       商品金额
 * @param   float   $goods_number       商品数量
 * @return  float   运费
 */
function shipping_fee($shipping_code, $shipping_config, $goods_weight, $goods_amount, $goods_number = '') {
    if (!is_array($shipping_config)) {
        $shipping_config = unserialize($shipping_config);
    }

    $filename = ROOT_PATH. 'plugins/shipping/' . $shipping_code . '.php';


    if (file_exists($filename)) {
        include_once($filename);
        $obj = new $shipping_code($shipping_config);

        return $obj->calculate($goods_weight, $goods_amount, $goods_number);
    } else {
        return 0;
    }
}

/**
 * 得到新订单号
 * @return  string
 */
function get_order_sn() {
    /* 选择一个随机的方案 */
    mt_srand((double) microtime() * 1000000);

    return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

/**
 * 计算积分的价值（能抵多少钱）
 * @param   int     $integral   积分
 * @return  float   积分价值
 */
function value_of_integral($integral) {
    $integral_scale=M('shop_config')->where("code='integral_scale'")->getField('value');
    $scale = floatval($integral_scale);

    return $scale > 0 ? round(($integral / 100) * $scale, 2) : 0;
}

/**
 * 获得订单需要支付的支付费用
 *
 * @access  public
 * @param   integer $payment_id
 * @param   float   $order_amount
 * @param   mix     $cod_fee
 * @return  float
 */
function pay_fee($payment_id, $order_amount, $cod_fee = null) {
    $pay_fee = 0;
    $payment = D('Order')->payment_info($payment_id);
    $rate = ($payment['is_cod'] && !is_null($cod_fee)) ? $cod_fee : $payment['pay_fee'];

    if (strpos($rate, '%') !== false) {
        /* 支付费用是一个比例 */
        $val = floatval($rate) / 100;
        $pay_fee = $val > 0 ? $order_amount * $val / (1 - $val) : 0;
    } else {
        $pay_fee = floatval($rate);
    }

    return round($pay_fee, 2);
}

/**
 *  生成一个用户自定义时区日期的GMT时间戳
 *
 * @access  public
 * @param   int     $hour
 * @param   int     $minute
 * @param   int     $second
 * @param   int     $month
 * @param   int     $day
 * @param   int     $year
 *
 * @return void
 */
function local_mktime($hour = NULL , $minute= NULL, $second = NULL,  $month = NULL,  $day = NULL,  $year = NULL)
{
    // $timezone = date('Z');

    /**
    * $time = mktime($hour, $minute, $second, $month, $day, $year) - date('Z') + (date('Z') - $timezone * 3600)
    * 先用mktime生成时间戳，再减去date('Z')转换为GMT时间，然后修正为用户自定义时间。以下是化简后结果
    **/
    $time = mktime($hour, $minute, $second, $month, $day, $year);

    return $time;
}

/**
 * 格式化重量：小于1千克用克表示，否则用千克表示
 * @param   float   $weight     重量
 * @return  string  格式化后的重量
 */
function formated_weight($weight) {
    $weight = round(floatval($weight), 3);
    if ($weight > 0) {
        if ($weight < 1) {
            /* 小于1千克，用克表示 */
            return intval($weight * 1000) . '克';
        } else {
            /* 大于1千克，用千克表示 */
            return $weight . '千克';
        }
    } else {
        return 0;
    }


}

function  clear_cart($user_id,$rec_ids=array())
{
    if(!$user_id)return false;

   if(!empty($rec_ids))
    $str=" and rec_id ".db_create_in($rec_ids);

   $sql=" delete from ".C('DB_PREFIX')."cart where user_id='$user_id' ".$str;
    M()->execute($sql);
    return true;
   
}